Array Base Composite

Composite Pattern
컴포지트 패턴은 객체들의 집단에 대해 개별 인터페이스를 동일하게 가져가게 하기 위한 패턴이다.
사용자가 단일 개체와 복합개체를 동일하게 다루도록 한다.(객체를 트리 구조로 구성하여 부분-전체 계층 표현)
배열에 기반한 속성
class Creature{
int strength, agility, intelligence;
public:
int get_strength() const {
return strength;
}
void set_strength(int strength){
Creature::strength=stregnth;
}
// get, set
//
int sum() const {
return strength+agility+intelligence;
}
double average() const {
return sum()/3.0;
}
int max() const {
return ::max(::max(strength, agility), intelligence);
}
};
위와 같이 구현할 경우, 아래와 같은 문제점이 있다.
- 전체 합계를 계산할 때, 필드를 빠뜨리기 쉽다.
- 평균을 계산할 때, 상수값 3.0을 사용하며, 이는 필드의 개수가 바뀌었을 때 종속성을 야기한다.
- 최대 값을 구할 때 모든 필드 값 쌍마다 std::max()를 반복적으로 호출해야 함

다른 속성이 추가될 때마다, sum(), average(), max()가 리팩토링되어야 한다.

배열 기반 속성을 이용
class Creature{
enum Abilities{str, agl, intl, count};
array<int, count> abilities;
// abilities
int get_strength() const {return abilities[str];}
void set_strength(int value) {abilities[str]=value;}
// get, set
int sum() const {
return accumulate(abilities.begin(), abilities.end(), 0);
}
double average() const {
return sum()/(double)count;
}
int max() const {
return *max_element(abilities.begin(), abilities.end());
}
};
위와 같이 구현시 배열을 순회함으로서, 속성에 대한 통계치를 쉽게 구할 수 있다.